 let express = require("express");
let path = require("path")
let { readFun, writeFun } = require("./tools/filePlay.js")
// 引入multer 用于上传头像
let multer = require("multer");
let cookieParser = require("cookie-parser");
let bodyParser = require("body-parser");
// 引入获取时间模块儿
let {getTime} = require("./tools/time.js")
let web = express();
// 使用静态资源文件夹
web.use(express.static("public"));
web.use(bodyParser.urlencoded({ extended: true }));
web.use(cookieParser())
// 用户注册接口
web.post("/regiest", async (req, res) => {
    /*
     1.获取请求参数
     2.读取存储用户信息的文件
     3.判断当前用户是否存在若存在则已注册若不存在写入注册  存在则返回信息该用户已存在
     */
    //     1.获取请求参数
    let user = req.body;
    //  2.读取存储用户信息的文件
    let data = await readFun("./data/user.json");
    data = JSON.parse(data);
    let index = data.findIndex(item => item.username == user.username);
    // 若不存在则写入
    if (index == -1) {
        let obj = {
            username: user.username,
            password: user.password,
            header: "./header/default.png"
        }
        // 将用户信息添加到数组中
        data.push(obj);
        data = JSON.stringify(data);
        // 写入数据
        let msg = await writeFun("./data/user.json", data);
        if (msg == "写入成功") {
            res.send({
                code: 0,
                msg: "注册成功"
            })
        } else {
            res.send({
                code: 1,
                msg: "注册失败"
            })
        }
    } else {
        res.send({
            code: 1,
            msg: "该用户已存在"
        })
    }
})

//用户登录 
web.post("/login",async (req,res)=>{
    /* 
    登录流程：
    1.获取用户的账号密码
    2.读取存储用户信息的json文件
    3.判断当前登录的用户是否存在这个json文件中若存在则判断密码是否正确 秘密正确登录成功密码错误账户或密码错误，若不存在提示用户当前用户未注册
    */
   let user = req.body;
   let data = await readFun("./data/user.json");
   data=JSON.parse(data);
   // 使用findIndex方法判断当前数据中是否含有当前用户输入的用户名和密码若返回值为-1则不存在 相反则存在
   let index = data.findIndex(item=>{
       return item.username==user.username && item.password == user.password
   })
   
   if(index==-1){
        res.send({
            code:1,
            msg:"用户名或密码错误"
        })
   }else{
     // 登录成功后给客户端设置一个cookie 用来表示用户的登录状态;
     res.cookie("username",user.username)
       res.send({
           code:0,
           msg:"登录成功"
       })
   }
})

// 获取用户头像
web.get("/get/user",async (req,res)=>{
    // 获取请求体中的cookie
    let username = req.cookies.username;
    let data = await readFun("./data/user.json");
    data = JSON.parse(data);
    data.forEach(item =>{
        if(item.username == username){
            res.send({code:0,msg:"请求成功",data:item.header})
     
        }
    })
})
// 发表论坛接口

web.post("/send/msg",async (req,res)=>{
    /* 
     发表流程：
     1.获取前端传递过来的参数
     2.获取cookie用户名
     3.获取当前时间
     4.将获取到的所有内容组成一个对象 （用户，头像，时间，内容,评论list）
     5.读取data.json中的原有数据，然后将组成的新对象添加到读取的数据中；
     6.将最新的数据从新写入
    */
    let header = req.body.header;
    let content = req.body.content;
    // 获取cookie
    let username = req.cookies.username;
    // 获取当前时间
    let time = getTime();
    let msg = {
        username:username,
        header:header,
        content:content,
        time:time,
        // 用来存放评论数据
        pinglun:[]
    }
    let data = await readFun("./data/data.json");
    data = JSON.parse(data);
    // 在数组末尾添加元素 push();
    // 在数组开头添加元素 unshift();
    data.unshift(msg);
    let msgs = await writeFun("./data/data.json",JSON.stringify(data));
    if(msgs=='写入成功'){
        res.send({
            code:0,
            msg:"发布成功"
        })
    }else{
        res.send({
            code:1,
            msg:"发表失败"
        })
    }

})


// 获取论坛列表
web.get("/get/msg/list",async (req,res)=>{
    // 将data.json中的数据读取 返回给客户端
    let data = await readFun("./data/data.json");
    data = JSON.parse(data);
    res.send({
        code:0,
        msg:"获取成功",
        data:data
    })
})

// 删除指定论坛信息
web.post("/remove/msg",async (req,res)=>{
    // 获取前端传递的索引
    let index = req.body.index;
    let data =  await readFun("./data/data.json");
    data = JSON.parse(data);
    // splice 从数组中删除元素 参数一从那个索引开始删除 参数二删除几个元素
    data.splice(index,1)
    data = JSON.stringify(data);
    let msg = await writeFun("./data/data.json",data);
    if(msg=='写入成功'){
        res.send({
            code:0,
            msg:"删除成功"
        })
    }else{
        res.send({
            code:1,
            msg:"删除失败"
        }) 
    }

})


// 评论接口
web.post("/pinglun/msg",async (req,res)=>{
    // console.log(req.body)
    let {content,header,username,msgIndex} = req.body;
    let data = await readFun("./data/data.json");
    data = JSON.parse(data);
    // console.log( data[msgIndex])
    let obj = {
        content,
        header,
        username,
        time:getTime()
    }
    // console.log(obj)
    // 将信息添加到对应的评论列表中
    data[msgIndex].pinglun.unshift(obj);
    // console.log(data)
    let msg = await writeFun("./data/data.json",JSON.stringify(data));
    if(msg=='写入成功'){
        res.send({
            code:0,
            msg:"评论成功"
        })
    }else{
        res.send({
            code:1,
            msg:"评论失败"
        }) 
    }
})
/* 
上传头像流程：

*/
let headerImg ="";
//  配置multer;
let config = multer.diskStorage({
    // 设置存储路径
    destination:"./public/header",
    // 设置文件名称；
    filename:(req,file,callback)=>{
        // 获取原始文件名称
        let oldName = file.originalname;
        //获取原始文件后缀
        let hz = path.extname(oldName);
        // 获取客户端cookie的用户名
        let username = req.cookies.username;
        // 拼接成新文件名称
        headerImg = username+hz
        callback(null,headerImg)
    }
})
// 使用上传配置
let upload = multer({
    storage:config
})
web.post("/upload",upload.single("photo"),async (req,res)=>{
    // 获取当前上传用户
    let username = req.cookies.username;
    // 读取user.json用户信息
    let data = await readFun("./data/user.json");
    data = JSON.parse(data);
    data.forEach(item=>{
        if(item.username == username){
            item.header = "./header/"+headerImg;
        }
    })
    // 改变头像信息后从新写入文件
    data = JSON.stringify(data);
    let msg = await writeFun("./data/user.json",data);
    // 读取所有论坛数据
    let allData = await readFun("./data/data.json");
    // console.log(allData)
    allData = JSON.parse(allData);
    allData.forEach(item=>{
        if(item.username == username){
            item.header = "./header/"+headerImg;
        }
        // 判断当前论坛是否含有评论数据若有则遍历再来判断是否有当前用评论
        if(item.pinglun.length !=0 ){
            item.pinglun.forEach(value=>{
                if(value.username == username){
                    value.header = "./header/"+headerImg;
                }
            })
        }
    })
    allData = JSON.stringify(allData);
    await writeFun("./data/data.json",allData);
    res.send(`<script>window.location.href = '/'</script>`)
})

// 获取用户所有论坛
web.post("/get/user/msg",async (req,res)=>{
    let username = req.body.username;
    let data = await readFun("./data/data.json");
    data = JSON.parse(data);
    let newData = data.filter(item=>{
        return item.username == username
    })
    let msg = await readFun("./data/user.json");
    msg = JSON.parse(msg);
    let userheader;
    msg.forEach(item=>{
        if(item.username == username){
            userheader = item.header
        }
    })
    // console.log(newData)
    res.send({
        code:0,
        msg:"请求成功",
        data:newData,
        userheader:userheader
    })
})
//  配置multer;
let filename;
let config2 = multer.diskStorage({
    // 设置存储路径
    destination:"./public/file",
    // 设置文件名称；
    filename:(req,file,callback)=>{
        // 获取原始文件名称
        // let oldName = file.originalname;
        filename = file.originalname
        callback(null,file.originalname)
    }
})
// 使用上传配置
let uploads = multer({
    storage:config2
})
web.post("/upload/img",uploads.single("imgs"),(req,res)=>{
    res.send({
        code:0,
        msg:"上传成功",
        url:"file/"+filename
    })
})

web.post("/send/quan",async (req,res)=>{
    let data = await readFun("./data/friend.json");
    data = JSON.parse(data);
    let username = req.cookies.username;
    let header = req.body.header;
    let content = req.body.content;
    let imgurl = req.body.imgurl;
    let json = {
        username,
        content,
        header,
        imgurl,
        time:getTime(),
        pinglun:[]
    }
    data.unshift(json);
    data = JSON.stringify(data);
    await writeFun("./data/friend.json",data);
    res.send({
        code:0,
        msg:"发表成功"
    })
})
web.get("/get/friend",async (req,res)=>{
    let data = await readFun("./data/friend.json")
    data = JSON.parse(data);
    res.send({
        code:0,
        data:data
    })
})

web.post("/py/pl",async (req,res)=>{
    let data = await readFun("./data/friend.json");
    data = JSON.parse(data);
    let obj = {
        username:req.cookies.username,
        content:req.body.content,
        time:getTime(),
        header:req.body.header
    }
    data[req.body.index].pinglun.unshift(obj);
    data= JSON.stringify(data);
    await writeFun("./data/friend.json",data);
    res.send({
        code:0,
        msg:"评论成功"
    })
})
web.listen(8080, function () {
    console.log("项目启动成功...................")
})